﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


//数组指针变量
//•
//整形指针变量：
//int* pint;
//存放的是整形变量的地址，能够指向整形数据的指针。
//•
//浮点型指针变量：
//float* pf;
//存放浮点型变量的地址，能够指向浮点型数据的指针。
//那数组指针变量应该是：存放的应该是数组的地址，能够指向数组的指针变量。


//1int* p1[10];
// 
// 
//2int (*p2)[10];
//这⾥要注意：[]的优先级要⾼于*号的，所以必须加上（）来保证p先和*结合。

//int(*p)[10]
//1. int 指的是p所指向的数组的元素类型
//2. （*p）是数组指针变量名
//3. 【10】代表p所指向的数组中的元素个数


//实际上，数组指针很少用于一般的情况，多用于二维数组的传参


//⼆维数组传参的本质


//下面是一般的写法
//void test(int  a[3][5], int r, int c)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < r; i++)
//	{
//		for (j = 0; j < c; j++)
//		{
//			printf("%d ", a[i][j]);
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr, 3, 5);
//
//	return 0;
//}

//若是用指针的写法呢？
///⾸先我们再次理解⼀下⼆维数组，⼆维数组其实可以看做是每个元素是⼀维数组的数组，也就是⼆维数组的每个元素是⼀个⼀维数组。
//那么⼆维数组的⾸元素就是第⼀⾏，是个⼀维数组。
//即，二维数组的首元素为第一行

//重点：⼆维数组传参本质上也是传递了地址，传递的是第⼀⾏这个⼀维数组的地址，

//
//void test(int(*p)[5], int r, int c)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < r; i++)
//	{
//		for (j = 0; j < c; j++)
//		{
//			printf("%d", *(*(p + i) + j));  // 这里先搞到二维数组的首元素（第一行），然后加地址，跳过，搞三行，
//											//然后再对那个地址（一维数组的首元素地址）进行解引用，得到二维数组中的每一个元素
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr, 3, 5);
//
//	return 0;
//}

//总结：⼆维数组传参，形参的部分可以写成数组，也可以写成指针形式。


